import pandas as pd
import numpy as np


def process_clustering_results(excel_file):
    """
    处理Excel表中的聚类结果数据

    参数:
    excel_file: Excel文件路径
    """
    try:
        # 读取Excel文件
        df = pd.read_excel(excel_file, sheet_name='聚类结果')

        print(f"成功读取数据，共{len(df)}行")
        print(f"数据列: {list(df.columns)}")

        # 检查必要的列是否存在
        required_columns = ['部门名称', '聚类标签', '字段数', '聚类代表名称', '聚类代表数据项', '报表名称', '数据项']
        missing_columns = [col for col in required_columns if col not in df.columns]

        if missing_columns:
            print(f"缺少必要的列: {missing_columns}")
            return False

        # 创建结果DataFrame的副本
        result_df = df.copy()

        # 按照部门名称和聚类标签分组
        groups = df.groupby(['部门名称', '聚类标签'])

        print(f"共找到 {len(groups)} 个分组")

        # 处理每个分组
        for group_name, group_data in groups:
            dept, cluster_label = group_name
            print(f"\n处理分组: 部门={dept}, 聚类标签={cluster_label}")

            # 过滤掉字段数为空的行，用于查找最大值
            valid_data = group_data[group_data['字段数'].notna()]

            if len(valid_data) == 0:
                print(f"  - 该分组没有有效的字段数数据，跳过")
                continue

            # 找到字段数最大的行
            max_field_idx = valid_data['字段数'].idxmax()
            max_field_row = valid_data.loc[max_field_idx]

            max_report_name = max_field_row['报表名称']
            max_data_item = max_field_row['数据项']
            max_field_count = max_field_row['字段数']

            print(f"  - 找到最大字段数: {max_field_count}")
            print(f"  - 对应的报表名称: {max_report_name}")
            print(f"  - 对应的数据项: {max_data_item}")

            # 更新整个分组的聚类代表名称和聚类代表数据项
            # 找到该分组在结果DataFrame中的所有行索引
            group_indices = group_data.index

            # 更新这些行的聚类代表信息
            result_df.loc[group_indices, '聚类代表名称'] = max_report_name
            result_df.loc[group_indices, '聚类代表数据项'] = max_data_item

            print(f"  - 已更新 {len(group_indices)} 行数据")

        print("\n数据处理完成")

        # 保存到原文件的新sheet
        try:
            # 使用openpyxl引擎来追加sheet
            with pd.ExcelWriter(excel_file, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
                result_df.to_excel(writer, sheet_name='处理后的聚类结果', index=False)
            print("结果已成功保存到新sheet: '处理后的聚类结果'")
            return True
        except Exception as e:
            print(f"保存文件时出错: {str(e)}")
            # 如果上面的方法失败，尝试另一种方式
            try:
                from openpyxl import load_workbook
                book = load_workbook(excel_file)

                # 如果sheet已存在，删除它
                if '处理后的聚类结果' in book.sheetnames:
                    del book['处理后的聚类结果']

                # 创建新sheet
                from openpyxl.utils.dataframe import dataframe_to_rows
                new_sheet = book.create_sheet('处理后的聚类结果')

                # 写入数据
                for r_idx, row in enumerate(dataframe_to_rows(result_df, index=False, header=True), 1):
                    for c_idx, value in enumerate(row, 1):
                        new_sheet.cell(row=r_idx, column=c_idx, value=value)

                book.save(excel_file)
                print("结果已成功保存到新sheet: '处理后的聚类结果'")
                return True
            except Exception as e2:
                print(f"使用openpyxl保存也失败: {str(e2)}")
                return False

    except Exception as e:
        print(f"处理过程中出错: {str(e)}")
        return False


# 使用示例
if __name__ == "__main__":
    # 替换为你的Excel文件路径
    excel_file_path = "C:/Users/xingwenzheng/Desktop/代码测试集/全量数据/聚类报告_匹配结果_weighted0.xlsx"

    # 执行处理
    success = process_clustering_results(excel_file_path)

    if success:
        print("\n处理完成！")
    else:
        print("\n处理失败，请检查错误信息。")